﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="es" xml:lang="es" xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title>AAP: Proyecto de computación distribuida</title>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<meta http-equiv="content-language" content="es" />
		<link href="css/style.css" rel="stylesheet" type="text/css" />
		<link rel="shortcut icon" href="http://geneura.ugr.es/~jmerelo/asignaturas/AAP/AAP.png" type="image/x-icon" />
		<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" type="text/javascript"></script>
		<script src="js/Hyphenator.js" type="text/javascript"></script>
		<script src="js/es.js" type="text/javascript"></script>
		<script src="js/funciones.js" type="text/javascript"></script>
		<script type="text/javascript">
		//<![CDATA[
			var cantidad = 1;
			var timeout;

			$(document).ready(function()
			{
				$(".cambiar").click(function(){
					cantidad = cantidad + parseInt(this.value);
					if(cantidad < 1){
						cantidad = 1;
					}
					$("#cantidad").text(cantidad);
				});
				$("#colabora").click(function(){
					if($("#colabora").val() === "Calcular"){
						desactivar();
						calcular();
					}
					else{
						$("#colabora").attr('disabled', true);
						parar();
					}
				});
			});
		//]]>
		</script>
		<script type="text/javascript">
		//<![CDATA[
			Hyphenator.config({
				classname: 'columna',
				remoteloading: false	
			})
			Hyphenator.run();
		//]]>
		</script>
		<script type="text/javascript" src="https://www.google.com/jsapi"></script>
		<script type="text/javascript">
		//<![CDATA[
			var days = 7;
			google.load("visualization", "1", {packages:["corechart"]});
			google.setOnLoadCallback(function() {$.get('/@api', {request: 'statistics', days: days}, drawChart, 'json');});
			function drawChart(json) {
				var data = new google.visualization.DataTable();
				data.addColumn('string', 'Día');
				data.addColumn('number', 'Dígitos calculados');
				data.addRows(days);
				for (var i=0; i<days; i++) {
					var count = 0;
					for (var j=0; j<json.ips.length; j++)
						count += parseInt(json.values[i].value[json.ips[j]]);
					data.setValue(i, 0, json.values[i].day);
					data.setValue(i, 1, count);
				}

				var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
				chart.draw(data, {width: 458, height: 260, legend: 'top',
					backgroundColor: 'seashell', chartArea: {left:50,top:20,width:"80%",height:"75%"},
					hAxis: {title: 'Día', titleTextStyle: {color: 'red'}}}
				);
			}
		//]]>
		</script>
	</head>
	<body>
		<div id="pagina">
			<h1>AAP: Proyecto de computación distribuida</h1>
			<h2>Autor: Iñaki Úcar</h2>
			<div class="estante">
				<div class="columna izquierda">
					<h2>Cálculo de los decimales de &pi;</h2>
					<div class="aplic">
						<h3>Colabora</h3>
						<div align="center">
							<input type="button" class="cambiar" value="-10" />
							<input type="button" class="cambiar" value="-5" />
							<input type="button" class="cambiar" value="-1" />
							<span id="cantidad">1</span>
							<input type="button" class="cambiar" value="+1" />
							<input type="button" class="cambiar" value="+5" />
							<input type="button" class="cambiar" value="+10" />
							<input type="button" id="colabora" value="Calcular" />
						</div>
					</div>
					<div id="info">
						<div>Información:</div>
					</div>
				</div>
				<div class="columna derecha">
					<h2>Estadísticas</h2>
					<p>Aquí se muestra la cantidad de dígitos calculados en los últimos días (<a href="estadisticas.html">ver más estadísticas</a>).</p>
					<div id="chart_div"></div>
				</div>
				<div class="columna derecha">
					<h2>Lo que no se ve...</h2>
					<p>Detrás de esta aplicación, hay un servidor web escrito totalmente en JavaScript y basado en <a href="http://nodejs.org/" title="node.js">node.js</a>. Además, se han utilizado los siguientes módulos no estándar:</p>
					<ul>
						<li><a href="https://github.com/bentomas/node-mime">node-mime</a>: detector de tipos MIME.</li>
						<li><a href="https://github.com/oozcitak/xmlbuilder-js">xmlbuilder-js</a>: constructor de documentos XML.</li>
						<li><a href="https://github.com/Leonidas-from-XIV/node-xml2js/">node-xml2js</a>: conversor de XML a JSON.</li>
						<li><a href="https://github.com/danwrong/restler">restler</a>: cliente REST.</li>
						<li><a href="https://github.com/DTrejo/json-streamify">json-streamify</a>: conversor de JSON a texto.</li>
					</ul>
					<p>El almacenamiento es gestionado por una base de datos nativa XML, concretamente <a href="http://exist.sourceforge.net/" title="eXist-db">eXist</a>.</p>
					<h2>Agradecimientos</h2>
					<ul>
						<li>A los desarrolladores de node.js y los módulos utilizados.</li>
						<li>A <a href="http://www.csc.liv.ac.uk/~acollins/pi">Andrew Collins</a> por su implementación del algoritmo BBP en JavaScript.</li>
					</ul>
				</div>
				<div class="columna izquierda">
					<h2>FAQ</h2>
					<h3>¿Qué?</h3>
					<p>Según la <a href="http://es.wikipedia.org/wiki/Computaci%C3%B3n_distribuida" title="Computación distribuida">Wikipedia</a>,</p>
					<blockquote><em>La computación distribuida o informática en malla, es un nuevo modelo para resolver problemas de computación masiva utilizando un gran número de ordenadores organizadas en racimos incrustados en una infraestructura de telecomunicaciones distribuida.</em></blockquote>
					<p>Este proyecto trata de abordar un problema de computación masiva desde la sencillez del navegador web. Para ello, se ha creado una aplicación de computación distribuida en la que el usuario puede participar sin necesidad de ningún software especial: <strong>tan solo se necesita un navegador con un motor JavaScript habilitado</strong>.</p>
					<p>El problema al que se dedica esta implementación es el cálculo de los decimales del número &pi;. Para más detalles sobre el problema en sí, ve a la sección <a href="#acerca"><em>Acerca del cálculo de &pi;</em></a>.</p>
					<h3>¿Dónde?</h3>
					<p>¡Aquí mismo! ¡Encima de este FAQ!</p>
					<h3>¿Cómo?</h3>
					<p>Escoge un número de dígitos de &pi; a calcular mediante los botones "+" y "-" y luego pulsa el botón "Calcular"; cuando llegue a la cantidad indicada, el proceso se parará. No obstante, puede pararse manualmente en cualquier momento con solo volver a pulsar el botón.</p>
					<p>En el recuadro inmediatamente inferior se muestra información del proceso.</p>
					<h3>¿Por qué?</h3>
					<p>Si la pregunta es <em>¿por qué debería contribuir?</em>, la respuesta es porque es cómodo, fácil y no te cuesta nada.</p>
					<p>Si la pregunta es <em>¡por qué demonios has creado esta aplicación?</em>, la respuesta es... en su momento me pareció una buena idea.</p>
					<h3>¿Para qué?</h3>
					<p>No vamos a batir el récord de dígitos de &pi;, tampoco vamos a conseguir la paz en el mundo... pero <acronym title="[mensaje subliminal]">espero que me sirva para ganarme la nota en AAP</acronym>.</p>
				</div>
				<div class="columna derecha">
					<h2><a name="acerca">Acerca del cálculo de &pi;</a></h2>
					<p>Como sabrás, el número &pi; es un número irracional y, como tal, tiene infinitos decimales y es no periódico (no se llega en ningún momento a una secuencia repetitiva). </p>
					<p>¿Cómo se calcula un número irracional? <a href="http://es.wikipedia.org/wiki/N%C3%BAmero_%CF%80#C.C3.B3mputos_de_.CF.80" title="Cómputos de &pi;">Existen multitud de métodos y fórmulas para calcularlo</a>, más o menos eficientes. En cualquier caso, parece lógico pensar que, para calcular el dígito n-ésimo, es necesario conocer previamente los n-1 anteriores. Y, de hecho, así se asumió durante siglos. Sin embargo, en 1995, <a href="http://en.wikipedia.org/wiki/Bailey%E2%80%93Borwein%E2%80%93Plouffe_formula" title="BBP formula">David H. Bailey, Peter Borwein y Simon Plouffe</a> descubrieron y publicaron una fórmula que rompe con esta suposición.</p>
					<p>Existen otras fórmulas de este tipo, que se han tenido a bien llamar <strong>fórmulas BBP</strong> (de Bailey-Borwein-Ploffe), que básicamente permiten calcular el n-ésimo dígito de un número irracional sin ningún conocimiento previo.</p>
					<p>Aprovechando esto, el problema de calcular los dígitos de &pi; se convierte automáticamente en subdivisible en problemas más pequeños: el cálculo de cada dígito por separado, lo que nos permite el desarrollo de esta aplicación de computación distribuida.</p>
					<p>El algoritmo utilizado aquí calcula los dígitos de &pi; en base hexadecimal, así que no te asustes por la cadena de caracteres que aparecen tras los cálculos. No es un error: es una <em>feature</em>...</p> 
				</div>
			</div>
		</div>
	</body>
</html>
